var dbmysql = require('db-mysql');
var connectionToDB;

/**
 * Evento que se ejecutará cuando se efectue la conexión a la base de datos.
 * @name CaboCity.server.HandlerDBonReady
 * @function
 * 
 * @param server Información del servidor.
 * @param {string} server.hostname
 * @param {string} server.user
 * @param {string} server.database
 * @param {string} server.version
 * */

/**
 * Crea una conxión a la base de datos.
 * @name CaboCity.server.connectDB
 * @function
 * 
 * @param options Opciones de configuración y conexión de la base de datos.
 * @param {String} [options.hostname="localhost"] Host donde se intentará la conexión.
 * @param {String} options.user Usuario con el cual se realizará la conexión.
 * @param {String} options.password Password con el que el usuario se identificará.
 * @param {String} options.database Base de datos con el que se realizará la conexión.
 * 
 * @param {function(string)} [options.onError] Handler que se ejecutará cuando la conexión no ha sido infructuosa.
 * @param {CaboCity.server.HandlerDBonReady} [options.onReady] Handler que se ejecutará cuando la conexión ha sido correctamente efectuada.
 * 
 * @param [options.connection] Opciones relacionadas con la conexión.
 * @param {boolean} [options.connection.async=false] Forzar conexión asincrona con la base de datos.
 * */
exports.connectDB = function(options){
	connectionToDB = new dbmysql.Database({
		hostname: options.hostname | "localhost",
		user: options.user,
		password: options.password,
		database: options.database
	});

	if(options.connection == null || options.connection == undefined) options.connection = {};
	var oc = options.connection;
	oc.async = (oc.async != undefined)? false: true;
	
	connectionToDB.on('error', function(error) {
	    console.log('ERROR: ' + error);
	}).on('ready', function(server) {
	    console.log('Connected to ' + server.hostname + ' (' + server.version + ')');
	}).connect(options.connection);
};

/**
 * @name CaboCity.server.HandlerDBExecute
 * @function
 * 
 * @param {?string} error Error si lo ha habido.
 * @param {Object} rows Filas.
 * @param {Object} columns Columnas.
 * */

/**
 * Crea y ejecuta una nueva query a la base de datos préviamente ejecutada.
 * @name CaboCity.server.query
 * @function
 * 
 * @param {String} query Query a ejecutar en la base de datos.
 * @param {?Array.<*>} values Valores a sustituir en la query si existen "placeholders".
 * @param {CaboCity.server.HandlerDBExecute} handler Función que recibirá los resultados de la ejecución.
 * @param [options] Opciones de conexión.
 * @param {String} [options.async=false] Forzar conexión asíncrona a la hora de hacer la query.
 * */
exports.query = function(query, values, handler, options){
	connectionToDB.execute(query, values, handler, options);
};